package com.muyangren.poidemo.utils.word.template;

import com.deepoove.poi.data.RowRenderData;
import com.deepoove.poi.policy.DynamicTableRenderPolicy;
import com.deepoove.poi.policy.TableRenderPolicy;
import com.deepoove.poi.util.TableTools;
import com.sun.applet2.preloader.event.ConfigEvent;
import lombok.NoArgsConstructor;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;

import java.util.HashMap;
import java.util.List;
import java.util.Map;


/**
 * @author: muyangren
 * @Date: 2023/4/27
 * @Description: 自定义渲染插件-for循环【家庭人员】-【工作情况】
 * 这里因为需要操作表格-所以集成DynamicTableRenderPolicy：动态表格插件，允许直接操作表格对象
 * 详情请看：http://deepoove.com/poi-tl/#_%E9%BB%98%E8%AE%A4%E6%8F%92%E4%BB%B6
 * @Version: 1.0
 */
@NoArgsConstructor
public class TemplateTableRenderPolicy extends DynamicTableRenderPolicy {

    @Override
    public void render(XWPFTable xwpfTable, Object data) throws Exception {
        if (null == data) {
            return;
        }
        TemplateRowRenderData templateRowRenderData = (TemplateRowRenderData) data;
        List<RowRenderData> rowRenderDataList = templateRowRenderData.getRowRenderDataList();
        if (CollectionUtils.isNotEmpty(rowRenderDataList)) {
            // 1)计算数据表头所在行数 如图：resource/pictures/images4.jpg
             int familyMemberRow = 2;
            // 2)删掉空白内容：xwpfTable.removeRow是从下表0开始计算的，所以这里删除的是空白内容如图：resource/pictures/images5.jpg
            xwpfTable.removeRow(familyMemberRow);
            // 3)获取该表家庭成员表头高度 【familyMemberRow-1】即家庭成员表头的下标  作用：统一高度
            XWPFTableRow xwpfTableRow = xwpfTable.getRow(familyMemberRow-1);
            // 4)循环插入行 (倒序插入)ps：这里是一直在第9行插入表格。
            for (int i = rowRenderDataList.size() - 1; i > -1; i--) {
                // 4.1)插入表格
                XWPFTableRow insertNewTableRow = xwpfTable.insertNewTableRow(familyMemberRow);
                // 4.1.1)控制表格高度
                insertNewTableRow.setHeight(xwpfTableRow.getHeight());
                // 4.2)每行添加6个表格,这里需要根据实际情况填充。秉持多则退少补原则
                // 如图：假如我添加12个 resource/pictures/images6.jpg
                // 如图：假如我添加10个 resource/pictures/images7.jpg
                // 注：想看效果时记得注释下面的代码 【TableTools.mergeCellsHorizonal】,【TableTools.mergeCellsVertically】
                for (int j = 0; j < 6; j++) {
                    insertNewTableRow.createCell();
                }
                // 基本信息占1格,家庭成员占1个,关系、姓名、职位各占3 刚好11格
                // fromCol 数据所在的列下标 ，toCol 横向合并到那个单元格下标
                // 5)合并上面创建的11个单元格  fromCol-toCol 且 fromCol(起始) < toCol(结束)
                // 5.1)【关系】下标为2，所以2(fromCol)合并至4(toCol)的单元格
                TableTools.mergeCellsHorizonal(xwpfTable, familyMemberRow, 1, 2);
                // 5.2)【姓名】下标为3，所以3(fromCol)合并至5(toCol)的单元格：注意：按上一个合并后的结果再数格子并合并
                TableTools.mergeCellsHorizonal(xwpfTable, familyMemberRow, 2, 5);
                // 5.3)【职位】下标为4，所以4(fromCol)合并至6(toCol)的单元格：注意：按上一个合并后的结果再数格子并合并
                TableRenderPolicy.Helper.renderRow(xwpfTable.getRow(familyMemberRow), rowRenderDataList.get(i));
            }
            Map<String, Integer> countMap = new HashMap<>();
            for (RowRenderData rowRenderData : rowRenderDataList) {
                String string = rowRenderData.getCells().get(0).getParagraphs().get(0).getContents().get(0).toString();
                countMap.put(string, countMap.getOrDefault(string, 0) + 1);
            }
            int fromRow = familyMemberRow;
            int toRow = familyMemberRow-1;
            for (Map.Entry<String, Integer> entry : countMap.entrySet()) {
                toRow = toRow + entry.getValue();
                if (entry.getValue()>1) {
                    // 都是下标
                    // 7)跨行合并行 参数说明： 1-操作表格方法 2-需要合并行 3-开始合并列 4-结束合并列
                    // 7.1) 合并前：resource/pictures/images8.jpg
                    // 7.2) 合并后：resource/pictures/images9.jpg
                    TableTools.mergeCellsVertically(xwpfTable, 0, fromRow,  toRow);
                }
                fromRow= fromRow +entry.getValue();
            }
        }
    }
}
